﻿#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
	int i = 0;
	int a = 0;
	while (~scanf("%d", &a))
	{
		int count = 0;
		for (i = 0; i < 32; i++)
		{
			if ((a >> i) & 1 == 1)
			{
				count++;
			}
		}
		printf("%d\n", count);
	}	
	return 0;
} 

//考虑正负数问题
int count_one_bit(unsigned int n)
{
	int count = 0;
	while (n)
	{
		if ((n % 2) == 1)
		{
			count++;
		
		}
		n /= 2;
	}
	return count;
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int ret=count_one_bit(n);
	printf("%d\n", ret);
	return 0;
}


int main()
{
	int n = 0;
	scanf("%d", &n);
	int count = 0;
	while (n)
	{
		n = n & (n - 1);
		count++; 

    }
	printf("%d\n", count);
	return 0;
}

判断一个数的是否是2的次方数
n=n&(n-1)
 0001
0010
0100
1000
int main()
{
	int n = 0;
	scanf("%d", &n);
	if ((n & (n - 1)) == 0)
	{
		printf("YES\n");
	}
	else
	{
		printf("NO\n");

	}
	return 0;
}


//ax^2+bx+c=0 求解

//x1=（-b+（b^2-4ac)^1/2）/2a ,x2=（-b-（b^2-4ac)^1/2）/2a
#include <math.h>
int main()
{
	float a, b, c, tep, x1, x2 = 0;
	scanf("%f %f %f", &a, &b, &c);
	//计算德尔塔
	tep = b * b - 4 * a * c;
	if (tep > 0)
	{
		x1 = (-b + sqrt(tep) / (2 * a));
		x2 = (-b - sqrt(tep) / (2 * a));
		printf("二根分别是%.1f %.1f", x1, x2);
	}
	else if (tep == 0) //
	{
		x1 =x2= (-b + sqrt(tep) / (2*a));
		printf("二根分别是%f %f", x1, x2);

	}
	else
	{
		float x3 = (-b + sqrt(-tep) / (2 * a));
		float x4 = (-b - sqrt(-tep) / (2 * a));
		printf("二根分别是%f %f", x3, x4);

	}


	return 0;
}

2进制位置0 或者置 1
编写代码将13⼆进制序列的第5位修改为1，然后再改回0?
 
 //
/*这题目很巧妙

首先 输入一个数比如说是13   0000 1101 你想改变他的第5位为1 

0000 1101    -------> 0001 1101

| 0001 0000        就把0000 0001左移4位就可以了。



0001 1101 怎么得到 0000 1101呢

& 0000 1111   ------->0000 1101

就是把1左移4位然后按位取反即可*/
int main()
{
	int n = 0;
	scanf("%d", &n);  //13    0000 1101 | 0001 0000 ----->  0001 1101 | 
	移动
	n = n | (1 << 4);
	printf("%d\n", n);
	复原
	n = n & ~(1 << 4);   // 0001 1101 &  = 0000 1101 =13
		 0000 1111

		printf("%d\n", n);
	return  0;
 
 
 


//不允许创建临时变量，交换两个整数的内容
//0异或a是a  a异或a是0 
int main()
{
	int a = 0;
	int b = 0;
	while (~scanf("%d %d", &a, &b))
	{
		a = a ^ b;
		b = a ^ b;//b=a^b^b ----->=b=a^0 b=a
		a = a ^ b;// a^a^b--->=  a==b;
		printf("a=%d,b=%d\n", a, b);
    }

	return 0;
}

#include  <stdio.h>
int main() {
    int n = 0;
    int count = 0;
    scanf("%d", &n);
    while (n) {
        n = n & (n - 1);
        count++;
    }
    printf("%d\n", count);

    return  0;
}



获取一个整数二进制序列中所有的偶数位和奇数位，分别打印出二进制序列
int main()
{
	int i = 0;
	int n = 0;
	scanf("%d", &n);
	//偶数
	for (i = 30; i >= 0; i -= 2)
	{
		printf("%d ", ((n >> i) & 1));
	}
	printf("\n");
	//奇数
	for (i = 31; i >= 1; i -= 2)
	{
		printf("%d ", ((n >> i) & 1));
	}
	return 0;
}


编程实现：两个int（32位）整数m和n的二进制表达中，有多少个位(bit)不同？ 

输入例子:

1999 2299

输出例子 : 7


方法1  利用for循环解决
int main()
{
	int n = 0;
	int m = 0;
	scanf("%d %d", &n, &m);
	int count = 0;
	for (int i = 0; i < 32; i++)
	{
		if (((m >> i) & 1) != ((n >> i) & 1))
		{
			count++;
		}
	}
	printf("%d", count);
	return 0;
}

//利用^来解决
int main()
{
	int n = 0;
	int m = 0;
	scanf("%d %d", &n, &m);
	int count = 0;
	int ret = m ^n;
	while (ret)
	{
		ret = ret &(ret - 1);
		count++;
	}
	printf("%d", count);
	return 0;
}


n!
int Fait(int n)
{
	if (n <= 1)
		return 1;
	else
		return n * Fait(n - 1);
}
int main()
{
	int i = 0;
	int n = 0;
	scanf("%d", &n);
	int sum = Fait(n);
	printf("%d", sum);
	return 0;
}


模拟实现strlen函数
非递归
int my_strlen(char* str)
{
	int count = 0;
	while (*str)
	{
		count++;
		str++;


	}
	return count;
}
int main()
{
	char arr[] = "abce";
	int len = my_strlen(arr);
	printf("%d\n", len);
	return 0;
}

//递归
int my_strlen(char* str)
{
	if (*str != '\0')
		return 1 + my_strlen(str + 1);
	else
		return 0;

}
int main()
{
	char arr[] = "abct";
	int len = my_strlen(arr);
	printf("%d", len);
	return 0;

}

编写一个函数 reverse_string(char * string)（递归实现）

实现：将参数字符串中的字符反向排列，不是逆序打印。

要求：不能使用C函数库中的字符串操作函数。
#include  <string.h>
void reverse_string(char* str, int len)
{
	char*left = str;
	char * right = str+len - 1;

	while (left <= right)
	{
		char tep  =*left;
		*left = *right;
			*right = *left;
		left++;
		right--;
	}
	
}
int main()
{
	char arr[] = "abc";
	int len = strlen(arr);
	reverse_string(arr, len);
	printf("%s", arr);
	return 0;
}


//例如，调用DigitSum(1729)，则应该返回1+7+2+9，它的和是19
int DigitSum(int n)
{
	if (n > 9)
		return DigitSum(n / 10) + n % 10;
	else
		return 1;
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int ret = DigitSum(n);
	printf("%d ", ret);
	return 0;
}

编写一个函数实现n的k次方，使用递归实现。

k==0  1
k>0 n*pow(n,k-1);
k<0  1/pow(n,-k);
double Pow(int n, int k)
{
	if (k > 0)
		return n* Pow(n, k-1);
	else if (k == 0)
		return 1;
	else
		return 1.0 / Pow(n, -k);
}

int main()
{
	int n = 0;
	int k = 0;
	scanf("%d %d", &n,&k);
	double ret=Pow(n, k);
	printf("%f\n", ret);
	return 0;
}

递归和非递归分别实现求第n个斐波那契数
例如：
输入：5  输出：5

递归方法
int Fait(int n)
{
	if (n <= 2)
		return 1;
	else
		return Fait(n - 1) + Fait(n - 2);
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int ret = Fait(n);
	printf("%d\n", ret);
	return 0;
}

//迭代方法
int Fait(int n)
{
	int a = 1;
	int b = 1;
	int c = 1;
	while (n>=3)
	{
		c = a + b;
		a=b;
		b = c;
		n--;
	}
	return c;
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int ret = Fait(n);
	printf("%d", ret);
	return 0;
}


//打印整数二进制的奇数位和偶数位
int main()
{
	int n = 0;
	scanf("%d", &n);
	for (int i = 30; i >= 0; i -= 2)
	{
		printf("%d ", ((n >> i) & 1));
	}
	printf("\n");
	for (int i = 31; i >= 1; i -= 2)
	{
		printf("%d ", ((n >> i) & 1));
	}
	return 0;
}

//交换两个变量（不创建临时变量）
int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	a = a ^ b;
	b = a ^ b;
	a = a ^ b;
	printf("a=%d,b=%d", a, b);
	
	return 0;
}


求Sn=a+aa+aaa+aaaa+aaaaa的前5项之和，其中a是一个数字，


int main()
{
	int n = 0;
	int m = 0;
	int k = 0;
	int sum = 0;
	scanf("%d %d", &n, &m);
	for (int i = 0; i < m; i++)
	{
		k = k * 10 + n;
		sum += k;
	}
	printf("%d\n", sum);
	return 0;
}

求出0～100000之间的所有“水仙花数”并输出。

//“水仙花数”是指一个n位数，其各位数字的n次方之和确好等于该数本身，
// 如:153＝1 ^ 3＋5 ^ 3＋3 ^ 3，则153是一个“水仙花数”。
#include <math.h>
int main()
{
	for (int i = 0; i <= 10000; i++)
	{
		int tep = i;
		int n = 1;
			//统计数的位数
		while (tep / 10)
		{
			n++;
			tep /= 10;
		}
		//计算数的次方
		tep = i;
		int sum = 0;
		while (tep)
		{
			sum += pow(tep % 10, n);
			tep /= 10;
		  }
		if (sum == i)
		{
		printf("%d ", i);
	    }
  }
	return 0;
}